﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MySql.Data.MySqlClient;
using Basicas.Utils;
using Basicas;
using System.Data;

namespace ProjetoJornada_DAL.Repositorio
{
    public class RepJornada
    {
        private DAO dao;
        private RepResponsavel repResponsavel;

        public RepJornada()
        {
            this.dao = DAO.Instance;
            this.repResponsavel = new RepResponsavel();
        }

        private Jornada CarregarJornadaSemResponsavel(MySqlDataReader dr)
        {
            Int32 id = dr.GetInt32("Id");
            DateTime dataInicial = dr.GetDateTime("dataInicial");
            DateTime dataFinal = dr.GetDateTime("dataFinal");
            String nome = dr.GetString("Nome") as String;
            bool eh_Default = dr.GetBoolean("eh_Default");

            Jornada jornada = new Jornada(id, dataInicial, dataFinal, nome, null);
            jornada.Eh_default = eh_Default;

            return jornada;
        }

        #region Metodos
        public int Inserir(Jornada jornada)
        {

            String storeProcedure = "sp_Jornada_Inserir";

            try 
	        {	        
		        MySqlParameter[]  parametros = new MySqlParameter[5];

                parametros[0] = new MySqlParameter();
                parametros[0].ParameterName = @"dataFinalIn";
                parametros[0].Value = jornada.DataFinal;
                parametros[0].DbType = DbType.Date;

                parametros[1] = new MySqlParameter();
                parametros[1].ParameterName = @"dataInicialIn";
                parametros[1].Value = jornada.DataInicial;
                parametros[1].DbType = DbType.Date;

                parametros[2] = new MySqlParameter();
                parametros[2].ParameterName = @"nomeIn";
                parametros[2].Value = jornada.Nome;
                parametros[2].DbType = DbType.String;

                parametros[3] = new MySqlParameter();
                parametros[3].ParameterName = @"IdResponsavelIn";
                parametros[3].Value = jornada.Responsavel.Id;
                parametros[3].DbType = DbType.Int32;

                parametros[4] = new MySqlParameter();
                parametros[4].ParameterName = @"Result";
                parametros[4].DbType = System.Data.DbType.Int32;
                parametros[4].Direction = ParameterDirection.Output;

                return (int) dao.ExecutaFuncao(parametros, storeProcedure);        
                
            }
	        catch (Exception ex)
	        {
        		Auxiliar.GravaLog(ex.Message,"inserirJornada");
		        throw ex;
	        }
        }
        public Boolean Remover(int Id)
        {
            String storeProcedure = "sp_Jornada_Delete";

            MySqlParameter[] parametros = new MySqlParameter[1];

            try
            {
                parametros[0] = new MySqlParameter();
                parametros[0].ParameterName = @"idJornada";
                parametros[0].Value = Id;
                parametros[0].DbType = System.Data.DbType.Int16;

                return dao.ExecutaSql(parametros, storeProcedure);
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "deleteJornada");
                throw ex;
            }
        }
        public Boolean Editar(Jornada jornada)
        {
            MySqlParameter[] parametros = new MySqlParameter[11];
            String storeProcedure = "sp_Jornada_Edit";

            try
            {
                parametros[0] = new MySqlParameter();
                parametros[0].ParameterName = @"codigo";
                parametros[0].Value = jornada.Id;
                parametros[0].DbType = System.Data.DbType.Int32;

                parametros[1] = new MySqlParameter();
                parametros[1].ParameterName = @"dataFim";
                parametros[1].Value = jornada.DataFinal;
                parametros[1].DbType = System.Data.DbType.Date;

                parametros[2] = new MySqlParameter();
                parametros[2].ParameterName = @"dataInicio";
                parametros[2].Value = jornada.DataInicial;
                parametros[2].DbType = System.Data.DbType.Date;

                parametros[3] = new MySqlParameter();
                parametros[3].ParameterName = @"nomeDigitado";
                parametros[3].Value = jornada.Nome;
                parametros[3].DbType = System.Data.DbType.String;

                parametros[4] = new MySqlParameter();
                parametros[4].ParameterName = @"idResponsavelIn";
                parametros[4].Value = jornada.Responsavel.Id;
                parametros[4].DbType = System.Data.DbType.Int32;

                parametros[5] = new MySqlParameter();
                parametros[5].ParameterName = @"cpfIn";
                parametros[5].Value = jornada.Responsavel.Cpf;
                parametros[5].DbType = System.Data.DbType.String;

                parametros[6] = new MySqlParameter();
                parametros[6].ParameterName = @"cargoIn";
                parametros[6].Value = jornada.Responsavel.Cargo;
                parametros[6].DbType = System.Data.DbType.Int32;

                parametros[7] = new MySqlParameter();
                parametros[7].ParameterName = @"nomeIn";
                parametros[7].Value = jornada.Responsavel.Nome;
                parametros[7].DbType = System.Data.DbType.String;

                parametros[8] = new MySqlParameter();
                parametros[8].ParameterName = @"telefoneIn";
                parametros[8].Value = jornada.Responsavel.Telefone;
                parametros[8].DbType = System.Data.DbType.String;

                parametros[9] = new MySqlParameter();
                parametros[9].ParameterName = @"celularIn";
                parametros[9].Value = jornada.Responsavel.Celular;
                parametros[9].DbType = System.Data.DbType.String;

                parametros[10] = new MySqlParameter();
                parametros[10].ParameterName = @"emailIn";
                parametros[10].Value = jornada.Responsavel.Email;
                parametros[10].DbType = System.Data.DbType.String;

                return dao.ExecutaSql(parametros, storeProcedure);
            }
            catch(Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "editarJornada -  repositorio");
                throw ex;
            }
        }

        public Jornada ConsultarJornadaPorId(int id)
        {
            String storeProcedure = "sp_Jornada_Select_Id";

            MySqlDataReader dado = null;
            MySqlDataReader dado2 = null;

            MySqlParameter[] parametros = new MySqlParameter[1];

            parametros[0] = new MySqlParameter();
            parametros[0].ParameterName = @"idJornada";
            parametros[0].Value = id;
            parametros[0].DbType = System.Data.DbType.Int32;

            Jornada jornada = null;

            try
            {
                dado = dao.ExecutaLeituraProcedure(parametros, storeProcedure);
                if (dado.Read())
                {
                    DateTime dataFinal = dado.GetDateTime("dataFinal");
                    DateTime dataInicial = dado.GetDateTime("dataInicial");
                    String nome = dado.GetString("Nome");
                    int idResponsavel = dado.GetInt32("IdResponsavel");
                    bool eh_Default = dado.GetBoolean("eh_Default");

                    if (dao != null)
                    {
                        dao.FecharConexao();
                    }

                    MySqlParameter[] parametros2 = new MySqlParameter[1];

                    parametros2[0] = new MySqlParameter();
                    parametros2[0].ParameterName = @"idResponsavel";
                    parametros2[0].Value = idResponsavel;
                    parametros2[0].DbType = System.Data.DbType.Int32;

                    dado2 = dao.ExecutaLeituraProcedure(parametros2, "sp_Responsavel_Id");

                    if (dado2.Read())
                    {
                        string cpf = dado2["CPF"] as string;
                        int cargo = dado2.GetInt32("Cargo");
                        string nomeResponsavel = dado2["Nome"] as string;
                        string telefone = dado2["Telefone"] as string;
                        string celular = dado2["Celular"] as string;
                        string email = dado2["email"] as string;

                        CargoCiti cc = (CargoCiti)cargo;

                        Responsavel responsavel = new Responsavel(idResponsavel, cpf, cc, nomeResponsavel, email, telefone, celular);
                        jornada = new Jornada(id, dataInicial, dataFinal, nome, responsavel);
                        jornada.Eh_default = eh_Default;
                    }
                }
                return jornada;
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "ConsultarJornadaPorID - Repositório");
                throw ex;
            }
            finally
            {
                if (dado != null)
                {
                    dado.Close();
                }
                if (dado2 != null)
                {
                    dado2.Close();
                }
                if (dao != null)
                {
                    dao.FecharConexao();
                }
            }
        }
        
        public List<Jornada> ConsultarTodasJornadas()
        {
            String storeProcedure = "sp_Jornada_Select_All";
            List<Jornada> jornadas = new List<Jornada>();
            MySqlDataReader dr = null;

            try
            {
                dr = dao.ExecutaLeituraProcedure(storeProcedure);

                while (dr.Read())
                {
                    jornadas.Add(this.CarregarJornadaSemResponsavel(dr));
                }
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "consultarAlunosPorNome");
                throw ex;
            }
            finally
            {
                if (dr != null)
                {
                    dr.Close();
                }

                dao.FecharConexao();
            }
            return jornadas;
        }

        public double ConsultarFaturamento(int id)
        {
            double faturamento;
            String storeProcedure = "sp_Jornada_Faturamento";

            MySqlParameter[] parametros = new MySqlParameter[2];

            try
            {
                parametros[0] = new MySqlParameter();
                parametros[0].ParameterName = @"idIn";
                parametros[0].Value = id;
                parametros[0].DbType = System.Data.DbType.Int32;

                parametros[1] = new MySqlParameter();
                parametros[1].ParameterName = @"Result";
                parametros[1].DbType = System.Data.DbType.Double;
                parametros[1].Direction = ParameterDirection.Output;

                faturamento = (double) dao.ExecutaFuncao(parametros,storeProcedure);

            }
            catch(Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "ConsultarFaturamento");
                throw ex;
            }
            finally
            {
                dao.FecharConexao();
            }
            return faturamento;
        }

        public int ConsultarQuatidadeTotalDeAlunos(int id)
        {
            int qtidadeTotal;
            String storeProcedure = "sp_Jornada_QuantidadeTotalDeAlunos";

            MySqlParameter[] parametros = new MySqlParameter[2];

            try
            {
                parametros[0] = new MySqlParameter();
                parametros[0].ParameterName = @"idIn";
                parametros[0].Value = id;
                parametros[0].DbType = System.Data.DbType.Int32;

                parametros[1] = new MySqlParameter();
                parametros[1].ParameterName = @"Result";
                parametros[1].DbType = System.Data.DbType.Int32;
                parametros[1].Direction = ParameterDirection.Output;

                qtidadeTotal = (int)dao.ExecutaFuncao(parametros, storeProcedure);

            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "ConsultarQuatidadeTotalDeAlunos");
                throw ex;
            }
            finally
            {
                dao.FecharConexao();
            }
            return qtidadeTotal;
        }

        public void SetDefault(int id)
        {
            String storeProcedure = "sp_Jornada_SetDefault";

            MySqlParameter[] parametros = new MySqlParameter[1];

            try
            {
                parametros[0] = new MySqlParameter();
                parametros[0].ParameterName = @"idIn";
                parametros[0].Value = id;
                parametros[0].DbType = System.Data.DbType.Int32;


                dao.ExecutaSql(parametros, storeProcedure);

            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "SetDefault");
                throw ex;
            }
            finally
            {
                dao.FecharConexao();
            }
        }

        public int SelecionarUltimainserida()
        {
            int ultimoId;
            String storeProcedure = "sp_Jornada_PegarUltimaInserida";

            MySqlParameter[] parametros = new MySqlParameter[1];

            try
            {
                parametros[0] = new MySqlParameter();
                parametros[0].ParameterName = @"Result";
                parametros[0].DbType = System.Data.DbType.Int32;
                parametros[0].Direction = ParameterDirection.Output;


                ultimoId = (int)dao.ExecutaFuncao(parametros, storeProcedure);

            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "SetDefault");
                throw ex;
            }
            finally
            {
                dao.FecharConexao();
            }
            return ultimoId;
        }

        #endregion
    }
}
